package com.solotiger.douban.util;

import android.util.Log;

/**
 * LogUtils工具说明:
 * 1 LOG_DEBUG==true時输出日志
 * 2 参数为null或者empty时输出警告日志
 */
public class LogUtils {
    private static final String SEPARATOR = ",";

    private static boolean LOG_STATUS = true;

    private enum LOG_LEVEL {
        V, D, I, W, E
    }

    /**
     * 使用场景：内部逻辑
     *
     * @param tag
     * @param message
     */
    public static void v(String tag, String message) {
        showLog(LOG_LEVEL.V, tag, message, LOG_STATUS);
    }

    /**
     * 使用场景：内部逻辑
     *
     * @param tag
     * @param message
     */
    public static void d(String tag, String message) {
        showLog(LOG_LEVEL.D, tag, message, LOG_STATUS);
    }

    /**
     * 使用场景：流程日志
     *
     * @param tag
     * @param message
     */
    public static void i(String tag, String message) {
        showLog(LOG_LEVEL.I, tag, message, LOG_STATUS);
    }

    /**
     * 使用场景：非法异常警告
     *
     * @param tag
     * @param message
     */
    public static void w(String tag, String message) {
        showLog(LOG_LEVEL.W, tag, message, true);
    }

    /**
     * 使用场景：错误
     *
     * @param tag
     * @param message
     */
    public static void e(String tag, String message) {
        showLog(LOG_LEVEL.E, tag, message, true);
    }

    /**
     * 主输出日志
     *
     * @param level
     * @param tag
     * @param message
     * @param logStatus：根据release版本和输出级别，false：不输出；true：输出
     */
    private static void showLog(LOG_LEVEL level, String tag, String message, boolean logStatus) {
        try {
            if (logStatus) {
                if (paramsIsValid(tag, message)) {
                    StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[4];

                    /*
                    StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
                    for (int i = 0; i < stackTraceElements.length; ++i) {
                        StackTraceElement stackTraceElementi = stackTraceElements[i];
                        Log.e("verking", getLogInfo(stackTraceElementi));
                    }*/
                    doLog(level, tag, message, stackTraceElement);
                } else {
                    Log.w("LogUtils", "log parameters is error!");
                }
            }
        } catch (Exception e) {
            Log.e("LogUtils", e.getMessage());
        }
    }

    private static void doLog(LOG_LEVEL level, String tag, String message,
                              StackTraceElement stackTraceElement) {
        switch (level) {
            case V:
                Log.v(tag, getLogInfo(stackTraceElement) + message);
                break;
            case D:
                Log.d(tag, getLogInfo(stackTraceElement) + message);
                break;
            case I:
                Log.i(tag, getLogInfo(stackTraceElement) + message);
                break;
            case W:
                Log.w(tag, getLogInfo(stackTraceElement) + message);
                break;
            case E:
                Log.e(tag, getLogInfo(stackTraceElement) + message);
                break;
        }
    }

    private static boolean paramsIsValid(String tag, String message) {
        return IsNotNullOrEmpty(tag) && IsNotNullOrEmpty(message);
    }

    private static boolean IsNotNullOrEmpty(String str) {
        return null != str && !str.isEmpty();
    }

    /**
     * 输出日志所包含的信息
     */
    public static String getLogInfo(StackTraceElement stackTraceElement) {
        StringBuilder logInfoStringBuilder = new StringBuilder();
        // 获取文件名.即xxx.java
        String fileName = stackTraceElement.getFileName();
        // 获取类名.即包名+类名
        String className = stackTraceElement.getClassName();
        // 获取方法名称
        String methodName = stackTraceElement.getMethodName();
        // 获取输出行数
        int lineNumber = stackTraceElement.getLineNumber();

        logInfoStringBuilder.append("[ ");
//        logInfoStringBuilder.append("fileName=").append(fileName).append(SEPARATOR);
        logInfoStringBuilder.append("class=").append(className).append(SEPARATOR);
        logInfoStringBuilder.append("method=").append(methodName).append(SEPARATOR);
        logInfoStringBuilder.append("line=").append(lineNumber);
        logInfoStringBuilder.append(" ] ");
        return logInfoStringBuilder.toString();
    }

    public static void setLogStatus(boolean logStatus) {
        LOG_STATUS = logStatus;
    }
}
